package controller;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.mysql.jdbc.Connection;

import main.Main;
import manager.CaisseManager;
import manager.LoginManager;
import model.Produit;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.Window;

public class CaisseController {
	@FXML private Button deconnexion;
	@FXML private Button valider;
	@FXML private Button payer;
	@FXML private Button toucheClavierUn;
	@FXML private Button toucheClavierDeux;
	@FXML private Button toucheClavierTrois;
	@FXML private Button toucheClavierQuatre;
	@FXML private Button toucheClavierCinq;
	@FXML private Button toucheClavierSix;
	@FXML private Button toucheClavierSept;
	@FXML private Button toucheClavierHuit;
	@FXML private Button toucheClavierNeuf;
	@FXML private Button toucheClavierZero;
	@FXML private Button toucheClavierVider;
	@FXML private Button suppressionArticleSelectionne;

	@FXML private Label sessionLabel;
	@FXML private TextField codeProduit;
	@FXML private TextField quantite;
//	@FXML private TextField montantAPayer;
	@FXML private Label montantAPayer;
	@FXML private TextField nombreArticle;
 	@FXML private TextField boutique;
	@FXML private TextField utilsateur;
	@FXML private Label reste;
	@FXML private TableView<Produit> tableProduit;
    @FXML private TableColumn<Produit, Integer> identifiantProduit;
    @FXML private TableColumn<Produit, String> nomProduit;
    @FXML private TableColumn<Produit, Double> prixUnitaireProduit;
    @FXML private TableColumn<Produit, Integer> quantiteProduit;
    @FXML private TableColumn<Produit, Double> prixTotalProduit;
    @FXML private Pane paneImageProduit;
    
	double montantTotalAPayer = 0;
	int quantiteProduitSaisi = 0;
	double prixTotalProduitSaisi = 0;
	final ObservableList<Produit> produitUnit = FXCollections.observableArrayList();

    CaisseManager caisseManager = new CaisseManager();
    
    
	public void initialize() {
		 
	}
	
	/**
	 * 
	 */
	public void gestionToucheClavier(){
		toucheClavierUn.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierUn.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierUn.getText());
  	        	}
 	        }
 	    });
 		toucheClavierDeux.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierDeux.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierUn.getText());
  	        	}
 	        }
 	    });
 		toucheClavierTrois.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierTrois.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierTrois.getText());
  	        	}
 	        }
 	    });
 		toucheClavierQuatre.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierQuatre.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierQuatre.getText());
  	        	}
 	        }
 	    });
 		toucheClavierCinq.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierCinq.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierCinq.getText());
  	        	}
 	        }
 	    });
 		toucheClavierSix.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierSix.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierSix.getText());
  	        	}
 	        }
 	    });
 		toucheClavierSept.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierSept.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierSept.getText());
  	        	}
 	        }
 	    });
 		toucheClavierHuit.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierHuit.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierHuit.getText());
  	        	}
 	        }
 	    });
 		toucheClavierNeuf.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierNeuf.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierNeuf.getText());
  	        	}
 	        }
 	    });
 		toucheClavierZero.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        	if(!"".equals(quantite)){
  	        		quantite.setText(quantite.getText()+toucheClavierZero.getText());
  	        	}else{
  	        		quantite.setText(toucheClavierZero.getText());
  	        	}
 	        }
 	    });
 		toucheClavierVider.setOnAction(new EventHandler<ActionEvent>() {
  	        
 	        public void handle(ActionEvent arg0) {
 	            // TODO Auto-generated method stub
  	        		quantite.setText("");
 	        }
 	    });
	}
	
	/**
	 * 
	 * @param loginManager
	 * @param sessionID
	 * @param utilisateur
	 */
	public void effectuerPaiement(){
		payer.setOnAction(new EventHandler<ActionEvent>() {
			public void handle(ActionEvent event) {
			//	caisseManager.effectuerPaiement(produitUnit);
				produitUnit.clear();
				tableProduit.setItems(produitUnit);
				codeProduit.clear();
				quantite.clear();
				montantAPayer.setText("0");
				nombreArticle.setText("0");
				reste.setText("");
				prixTotalProduitSaisi = 0;
				quantiteProduitSaisi = 0;
				montantTotalAPayer = 0;
			}
		});			
 	}
	
	/**
	 * 
	 * @param loginManager
	 * @param sessionID
	 * @param utilisateur
	 */
	public void ajouterProduit(){
  		valider.setOnAction(new EventHandler<ActionEvent>() {
			public void handle(ActionEvent event) {
				if (null != codeProduit && !"".equals(codeProduit)) {
					Connection cn = Connexion.connect();
					String sql = "SELECT * FROM  `produits`  WHERE prod_code_barres="+ codeProduit.getText() + "";
					Statement pstmnt;
					String b_nomProduit = "";
					float b_prixVenteCourant = 0;
					try {
						pstmnt = cn.createStatement();
						ResultSet rs = pstmnt.executeQuery(sql);
						while (rs.next()) {
							b_nomProduit = rs.getString("prod_libelle");
							b_prixVenteCourant = rs.getFloat("PVENTE_COURANT");
						}
						pstmnt.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					// Par défaut si aucune quantité n'est saisie on le met à 1
					if (quantite == null || quantite.getText().equals(""))
						quantiteProduitSaisi = 1;
					else
						quantiteProduitSaisi = Integer.parseInt(quantite.getText());

					prixTotalProduitSaisi = b_prixVenteCourant * quantiteProduitSaisi;
					Produit prod = new Produit(b_nomProduit, quantiteProduitSaisi, b_prixVenteCourant,	prixTotalProduitSaisi);
					// si le tableau contient déjà un produit on incrément juste son nombre
					produitUnit.add(prod);
					prod.setNomProduit(b_nomProduit);
					prod.setPrixUnitaire(b_prixVenteCourant);

					// Set du tableau
					nomProduit.setCellValueFactory(new PropertyValueFactory<Produit, String>("nomProduit")); // Valeur dans le pojo
					quantiteProduit.setCellValueFactory(new PropertyValueFactory<Produit, Integer>("quantite"));
					prixUnitaireProduit.setCellValueFactory(new PropertyValueFactory<Produit, Double>("prixUnitaire"));
					prixTotalProduit.setCellValueFactory(new PropertyValueFactory<Produit, Double>("prixTotal"));

					montantTotalAPayer = prixTotalProduitSaisi	+ montantTotalAPayer;
					montantAPayer.setText("" + montantTotalAPayer);
					nombreArticle.setText("" + produitUnit.size());
					tableProduit.setItems(produitUnit);
				}
			}
		});			
 	}
	
 	/**
	 * Suppression d'un produit sélectionné dans le tableau
	 */
	public void supprimerArticleTableau(){
		tableProduit.setRowFactory( tv -> {
		    TableRow<Produit> row = new TableRow<>();
		    row.setOnMouseClicked(event -> {
		        if (event.getClickCount() == 1 && (!row.isEmpty()) ) {
 		        	suppressionArticleSelectionne.setOnAction(new EventHandler<ActionEvent>() {
		    			public void handle(ActionEvent event) {
		    				System.out.println(row.getItem().getPrixUnitaire());
		    				montantTotalAPayer = montantTotalAPayer - row.getItem().getPrixUnitaire();
							montantAPayer.setText(""+montantTotalAPayer);
							produitUnit.remove(row.getItem());
							nombreArticle.setText(""+produitUnit.size());
		    				produitUnit.remove(row.getItem());		
		    			}
		    		});			
		        }
		    });
		    return row ;
		});
	}
	@FXML
	private void handleAjoutProduit() {
		System.out.println("Hello word");
		Produit produit = new Produit();
		showProduitDetails(produit);
	}

	private void showProduitDetails(Produit produit) {
		// TODO Auto-generated method stub
 		try {
			// Load the fxml file and create a new stage for the popup dialog.
			FXMLLoader loader = new FXMLLoader();
			loader.setLocation(Main.class
					.getResource("../frxml/AjoutProduit.fxml"));
			AnchorPane page = (AnchorPane) loader.load();
			// Pane page = (Pane) loader.load();

			// Create the dialog Stage.
			Stage dialogStage = new Stage();
			dialogStage.setTitle("Ajout Nouveau Produit");
			dialogStage.initModality(Modality.WINDOW_MODAL);
			Window primaryStage = null;
			dialogStage.initOwner(primaryStage);
			Scene scene = new Scene(page);
			dialogStage.setScene(scene);

			// Set the person into the controller.
			AjoutProduitController controller = loader.getController();
			controller.setDialogStage(dialogStage);

			// Person tempPerson = new Person();
			controller.setProduit(produit);

			// Show the dialog and wait until the user closes it
			dialogStage.showAndWait();

			return;
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}

	}
	        
	public void showAdministration() throws IOException {
		try {
			// Load the fxml file and create a new stage for the popup dialog.
			FXMLLoader loader = new FXMLLoader();
			loader.setLocation(Main.class
					.getResource("../frxml/Administration.fxml"));
			BorderPane page = (BorderPane) loader.load();
			// Pane page = (Pane) loader.load();
			Stage test = new Stage();
			// Create the dialog Stage.
			Stage dialogStage = new Stage();
			dialogStage.setTitle("Administration");
			dialogStage.initModality(Modality.WINDOW_MODAL);
			Window primaryStage = null;
			dialogStage.initOwner(primaryStage);
			Scene scene = new Scene(page);
			// Parent userSubMenu = (Parent)loader.load();
			dialogStage.setScene(scene);

			// Set the person into the controller.
			AdministrationController controller = loader.getController();
			// controller.setDialogStage(dialogStage);

			// Person tempPerson = new Person();
			// controller.setProduit(produit);

			// Show the dialog and wait until the user closes it
			dialogStage.show();

			return;
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}

	}
	   	        
 	/**
	 * 
	 * @param loginManager
	 * @param sessionID
	 * @param utilisateur
	 */
	public void deconnexion(final LoginManager loginManager, String sessionID,	String utilisateur) {
		if (null != deconnexion) {
			deconnexion.setOnAction(new EventHandler<ActionEvent>() {
				public void handle(ActionEvent event) {
					loginManager.deconnexion();
				}
			});
		}
	}
	
	public void initSessionID(final LoginManager loginManager, String sessionID, String utilisateur) {
 		boutique.setText(utilisateur);
 		this.gestionToucheClavier();
 		this.ajouterProduit();
 		this.effectuerPaiement();
 		this.deconnexion(loginManager, sessionID, utilisateur);
 		this.supprimerArticleTableau();
 	}
}
